package tpui;

import java.util.ArrayList;

public abstract class Ficha {
	private int x;
	private int y;
	private Tablero t;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public Tablero getT() {
		return t;
	}
	public void setT(Tablero t) {
		this.t = t;
	}

	public  Ficha(int x, int y, Tablero t){
		this.setX(x);
		this.setY(y);
		this.setT(t);
	}
	
	//Asume que esta en un lugar valido (no necesariamente es valido).
	//el tablero nunca tiene una "celda" en NULL o vacia.
	public ArrayList<Ficha> caramelosIguales() {
		ArrayList<Ficha> lista= new ArrayList<Ficha>();
		this.scanInicial(lista);
		this.ScansLaterales(lista);
		if(lista.size()>=2){
			lista.add(this);
		}
		return lista;
	}
	
	//Falta agregar Control sobre los margenes del tablero.
	//Analiza las lindantes.
	private void scanInicial(ArrayList<Ficha> lista){
		Tablero t = this.getT();
		int c_x = this.getX();
		int c_y = this.getY();
		Ficha tmp_F_1 = t.tomaFicha(c_x, (c_y + 1));
		Ficha tmp_F_2 = t.tomaFicha(c_x, (c_y - 1));
		
		if(this.sonIguales(tmp_F_1, tmp_F_2)){
			lista.add(tmp_F_1);
			lista.add(tmp_F_2);
		}
		tmp_F_1 = t.tomaFicha((c_x+1), c_y);
		tmp_F_2 = t.tomaFicha((c_x-1), c_y);
		
		if(this.sonIguales(tmp_F_1,tmp_F_2 )){
			lista.add(tmp_F_1);
			lista.add(tmp_F_2);
		}
	}
	//Falta agregar Control sobre los margenes del tablero.
	private void ScansLaterales(ArrayList<Ficha> lista){
		this.ScanY(lista);
		this.ScanX(lista);
	}
	//Falta agregar Control sobre los margenes del tablero.
	private void ScanY(ArrayList<Ficha> lista){
		ArrayList<Ficha> tmplista = new ArrayList<Ficha>();
		int f_x = this.getX();
		int f_y = this.getY();
		Tablero t = this.getT();
		Boolean flag =true;
		Boolean subflag = true;
		int var = 1;
		while(flag){
			while(subflag){
				Ficha f_tmp = t.tomaFicha(f_x, f_y + var);
				if(this.sosIgual(f_tmp)){
					if(! lista.contains(f_tmp)){
					tmplista.add(f_tmp);
					}
					var ++;
				}else{
					var = 1;
					subflag=false;
				}
			}
			Ficha f_tmp = t.tomaFicha(f_x, f_y - var);
			if(this.sosIgual(f_tmp)){
				if(! lista.contains(f_tmp)){
					tmplista.add(f_tmp);
					}
				var ++;
			}else{
				var = -1;
				flag=false;
			}
		}
		if(tmplista.size() > 1){
			lista.addAll(tmplista);
		}
	}
	//Falta agregar Control sobre los margenes del tablero.
	private void ScanX(ArrayList<Ficha> lista){
		ArrayList<Ficha> tmplista = new ArrayList<Ficha>();
		int f_x = this.getX();
		int f_y = this.getY();
		Tablero t = this.getT();
		Boolean flag =true;
		Boolean subflag = true;
		int var = 1;
		while(flag){
			while(subflag){
				Ficha f_tmp = t.tomaFicha(f_x + var, f_y);
				if(this.sosIgual(f_tmp)){
					if(! lista.contains(f_tmp)){
						tmplista.add(f_tmp);
						}
					var ++;
				}else{
					var = 1;
					subflag=false;
				}
			}
			Ficha f_tmp = t.tomaFicha(f_x - var, f_y);
			if(this.sosIgual(f_tmp)){
				if(! lista.contains(f_tmp)){
					tmplista.add(f_tmp);
					}
				var ++;
			}else{
				var = -1;
				flag=false;
			}
		}
		if(tmplista.size() >= 2){
			lista.addAll(tmplista);
		}
	}
	
	public abstract Boolean sonIguales(Ficha c, Ficha c2);
	
	public abstract Boolean sosIgual(Ficha c);
	
	public abstract Boolean sosVerde();
	
	public abstract Boolean sosVioleta();
	
	public abstract Boolean sosRojo();
	
	public abstract Boolean sosAmarillo();
	
	public abstract Boolean sosCeleste();
	
	public abstract Boolean sosNaranja();
}
